#include <stdio.h>
#include <stdlib.h>

// f返回一个整数
int * f(void)
{
    int a[3] = {1,2,3}; // 局部变量，会在函数返回时立即被释放
    return a; // 此处数组a会被自动转化为指向首元素的指针
}

int * f2(void)
{
    int n = 100; // 栈内存，在函数返回时会立即被释放
    return &n;
}

int * f3(void)
{
    int *p = malloc(4); // 在堆分配的内存，永远存在直到free
    *p = 666;
    return p; // 返回指针p的内容
}

int main(int argc, char const *argv[])
{
    // int *p = f(); // x得到f的返回值
    // for(int i=0; i<3; i++)
    //     printf("%d\n", p[i]);

    // int *k = f2();
    // printf("%d\n", *k); // k --> n(已经被释放)

    int *k = f3(); // k --> 堆内存（4）
    printf("%d\n", *k); // ok的
    free(k);

    return 0;
}
